package ru.mirent;

import io.qameta.allure.Allure;
import io.qameta.allure.model.TestResult;
import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;
import java.util.function.Consumer;

/**
 * Демонстрация интерактивного блока 'Description' с кнопками взаимодействия с элементами теста.
 */
public class AllureDescriptionTest {

    /**
     * Пример прикрепления к Allure-отчету блока 'Description' в виде HTML кода.
     * Прикрепить можно как элементы HTML кода, так и полноценную HTML страницу с секциями head, style, body.
     * Но фактически будут рабоать только тэги элементов и тэги примера.
     * Скрипты в отдельном блоке так же не будут работать, только в объявлении самого тэга.
     */
    @Test
    void simpleDescriptionExampleTest() throws IOException {
        String descriptionExample = FileUtils.readFileToString(
                new File("src/test/resources/descriptions/description_example.html"), "UTF-8");

        if (Allure.getLifecycle().getCurrentTestCase().isPresent()) {
            Allure.getLifecycle().updateTestCase(new Consumer<TestResult>() {
                @Override
                public void accept(TestResult testResult) {
                    testResult.setDescriptionHtml(descriptionExample);
                }
            });
        }
    }

    /**
     * Пример большого тестас двумя панелями, добавленными в блок 'Description' теста.
     * @throws IOException ошибка при чтении файла
     */
    @Test
    void interactiveDescriptionExampleTest() throws IOException {
        String jsonExample = "{\n" +
                "  \"uuid\": \"99999\",\n" +
                "  \"name\": \"interactiveDescriptionExampleTest()\",\n" +
                "  \"children\": [\n" +
                "    \"5555\"\n" +
                "  ],\n" +
                "  \"befores\": [],\n" +
                "  \"afters\": [],\n" +
                "  \"start\": 1712339840769,\n" +
                "  \"stop\": 1712339841094\n" +
                "}";

        Allure.step("Шаг 1", () -> {
            Allure.step("Внутренний шаг 1.1", () -> {
                Allure.addAttachment("JSON", "application/json", jsonExample, ".json");
            });
            Allure.step("Внутренний шаг 1.2", () -> {
                Allure.addAttachment("JSON", "application/json", jsonExample, ".json");
            });
        });
        Allure.step("Шаг 2", () -> {
            Allure.step("Внутренний шаг 2.1", () -> {
                Allure.addAttachment("JSON", "application/json", jsonExample, ".json");
            });
            Allure.step("Внутренний шаг 2.2", () -> {
                Allure.addAttachment("JSON", "application/json", jsonExample, ".json");
            });
        });
        Allure.step("Шаг 3", () -> {
            Allure.step("Внутренний шаг 3.1", () -> {
                Allure.addAttachment("JSON", "application/json", jsonExample, ".json");
            });
            Allure.step("Внутренний шаг 3.2", () -> {
                Allure.addAttachment("JSON", "application/json", jsonExample, ".json");
            });
        });
        Allure.step("Шаг 4", () -> {
            Allure.step("Внутренний шаг 4.1", () -> {
                Allure.addAttachment("JSON", "application/json", jsonExample, ".json");
            });
            Allure.step("Внутренний шаг 4.2", () -> {
                Allure.addAttachment("JSON", "application/json", jsonExample, ".json");
            });
        });

        String testCaseControlPanelOne = FileUtils.readFileToString(
                new File("src/test/resources/descriptions/control_panel_one.html"), "UTF-8");

        String testCaseControlPanelTwo = FileUtils.readFileToString(
                new File("src/test/resources/descriptions/control_panel_two.html"), "UTF-8");

        if (Allure.getLifecycle().getCurrentTestCase().isPresent()) {
            Allure.getLifecycle().updateTestCase(new Consumer<TestResult>() {
                @Override
                public void accept(TestResult testResult) {
                    testResult.setDescriptionHtml(
                            testCaseControlPanelOne + testCaseControlPanelTwo);
                }
            });
        }
    }
}
